/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Infoclient;

import Protocol.ClientObject;
import Protocol.ComProtocol;
import Protocol.ReturnObject;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import javax.swing.*;

/**
 *
 * @author Erik
 */
public class GUI extends JFrame implements ActionListener{
    
    //Variabelen van de tabs
    private JTabbedPane tabbedPane;
    private JPanel tabLogin;
    private JPanel tabQuery;
    private JPanel tabTable;
    private JScrollPane sb;
    private Piechart pie;
    private JPanel tabBar;
    private JPanel tabHelp;
    
    //Attributen van het log in tab
    private JLabel labelLogin = new JLabel("Log in");
    private JLabel labelUsername = new JLabel("Username:");
    private JLabel labelPassword = new JLabel("Password:");
    private JTextField fieldUsername;
    private JPasswordField fieldPassword;
    private JButton buttonLogin = new JButton("Log in");
    private boolean loggedIn = false;
    
    //Attributen van het query selection tab;
    private JLabel labelQuery = new JLabel("Query selection");
    private JButton buttonSelection1 = new JButton("Selection 1");
    private JButton buttonSelection2 = new JButton("Selection 2");
    private JButton buttonSelection3 = new JButton("Selection 3");
    private boolean qSelected = false;
    
    //Attributen van het table tab
    private JLabel labelTable = new JLabel("Table");
    private JTable table = new JTable();
    
    //Attributen van het pie chart tab
    private JLabel labelPie = new JLabel("Pie chart");
    
    //Attributen van het bar chart tab
    private JLabel labelBar = new JLabel("Bar chart");
    private JLabel labelObject = new JLabel("Object");
    private JLabel labelAmount = new JLabel("Amount");
    
    //Attributen van het help tab
    private JLabel labelHelp = new JLabel("Help");
    private JTextArea fieldHelp = new JTextArea();

    private ObjectOutputStream output;
    private ComProtocol cp;
    private JButton select, update, login, logout;
    private JTextField user, query;
    private JTextArea text;
    private String username, password;

    
    //Constructor
    public GUI(){
        //Standaard schermgegevens aanmaken
        setTitle("Infoclient");
        setSize(480, 480);
        setBackground(Color.WHITE);
        setResizable(false);
        
        //Dit zorgt ervoor dat de juiste Tab (de tab waarop geklikt is) wordt weergeven
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);        
        
        //Het aanroepen van de functies die de tabs aanmaken (in deze functies is het "subscherm" opgebouwd
        createLoginTab();
        createQueryTab();
        createTableTab();
        createPieTab();
        createBarTab();
        createHelpTab();
       
        //De tabbladbar aanmaken
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Log in", tabLogin);
        tabbedPane.addTab("Query Selection", tabQuery);
        tabbedPane.addTab("Table", tabTable);
        tabbedPane.addTab("Pie chart", sb);
        tabbedPane.addTab("Bar chart", tabBar);
        tabbedPane.addTab("Help", tabHelp);
        
        topPanel.add(tabbedPane, BorderLayout.CENTER);
        
        //Zorgt ervoor dat de tabbladen die nog niet weergeven mogen worden, disabled zijn
        tabbedPane.setEnabledAt(1, false);
        tabbedPane.setEnabledAt(2, false);
        tabbedPane.setEnabledAt(3, false);
        tabbedPane.setEnabledAt(4, false);
       
        //Action Listeners toevoegen
        buttonLogin.addActionListener(this);
        buttonSelection1.addActionListener(this);
        buttonSelection2.addActionListener(this);
        buttonSelection3.addActionListener(this);
       
    }
    
    //Mehode voor het aanmaken van het login tab
    public void createLoginTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabLogin = new JPanel();
        tabLogin.setLayout(null);
        
        //Label van log in scherm wordt hier toegevoegd
        labelLogin.setBounds(10, 10, 160, 20);
        tabLogin.add(labelLogin);
        
        //Label van username textfield wordt hier toegevoegd
        labelUsername.setBounds(10, 40, 65, 20);
        tabLogin.add(labelUsername);
        
        
        //Label van password textfield wordt hier toegevoegd
        labelPassword.setBounds(10, 70, 65, 20);
        tabLogin.add(labelPassword);
        
        //Hier wordt het textfield van de username toegevoegd
        fieldUsername = new JTextField(5);
        fieldUsername.setBounds(80, 40, 100, 20);
        tabLogin.add(fieldUsername);
        
        //Hier wordt het textfield van het password toegevoegd
        fieldPassword = new JPasswordField(5);
        fieldPassword.setBounds(80, 70, 100, 20);
        tabLogin.add(fieldPassword);
        
        //Log in knop wordt hier toegevoegd
        buttonLogin.setBounds(10,100,160,30);
        tabLogin.add(buttonLogin);
    }
    
    //Mehode voor het aanmaken van het query tab
    public void createQueryTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabQuery = new JPanel();
        tabQuery.setLayout(null);
        
        //Toevoegen van de querylabel
        labelQuery.setBounds(10, 10, 160, 20);
        tabQuery.add(labelQuery);
        
        //Toevoegen van selectie knop 1
        buttonSelection1.setBounds(10, 40, 100, 40);
        tabQuery.add(buttonSelection1);
        
        //Toevoegen van selectie knop 2
        buttonSelection2.setBounds(10, 90, 100, 40);
        tabQuery.add(buttonSelection2);
        
        //Toevoegen van selectie knop 2
        buttonSelection3.setBounds(10, 140, 100, 40);
        tabQuery.add(buttonSelection3);
    }
    
    //Mehode voor het aanmaken van het table tab
    public void createTableTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabTable = new JPanel();
        tabTable.setLayout(null);
        
        //Toevoegen van de table label
        labelTable.setBounds(10, 10, 160, 20);
        tabTable.add(labelTable);
        
        //PETER JE MOET ZELF MAAR KIJKEN WAT JE HIERMEE DOET, DIT IS VOOR HET TOEVOEGEN VAN EEN SCROLLBAR
        //Toevoegen van de table
        table.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //Hier wordt de scrollbar aan de table toegevoegd
        JScrollPane scrollBar = new JScrollPane(table);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 65, 450, 300);
        tabTable.add(scrollBar);
    }
    
    /**
    * Maakt een taartdiagram en scrollpane.
    * Het taartdiagram wordt toegevoegd aan de scrollpane en de scrollpane aan de tabbedPane.
    * @author Roman Wiedijk
    * @since 22-05-2012
    */
    
    //Mehode voor het aanmaken van het pie tab
    public void createPieTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        pie = new Piechart();
        pie.setPreferredSize(new Dimension(480, 2000));
        sb = new JScrollPane(pie);
        sb.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        sb.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    }
    
    
    //Mehode voor het aanmaken van het bar tab
    public void createBarTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabBar = new JPanel();
        tabBar.setLayout(null);
                
        //Toevoegen van de bar label
        labelBar.setBounds(10, 10, 160, 20);
        tabBar.add(labelBar);
        
        //Toevoegen van de amount label
        labelAmount.setBounds(10, 40, 75, 20);
        tabBar.add(labelAmount);
        
        //Toevoegen van de object label
        labelObject.setBounds(350, 350, 75, 20);
        tabBar.add(labelObject);
    }
    
    //Mehode voor het aanmaken van het help tab
    public void createHelpTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabHelp = new JPanel();
        tabHelp.setLayout(null);
                
        //Toevoegen van de help label
        labelHelp.setBounds(10, 10, 160, 20);
        tabHelp.add(labelHelp);
        
        //Hier wordt de textarea aangemaakt, dit is voor de properties
        fieldHelp.setEditable(false);
        fieldHelp.setText("Hier komt de help tekst te staan, deze tekst wordt automatisch afgebroken en de scrollbar functioneert ook automatisch");
        fieldHelp.setLineWrap(true);
        fieldHelp.setWrapStyleWord(true);
        fieldHelp.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //Hier wordt de scrollbar aangemaakt, het textfield wordt aan de scrollbar toegevoegd en daarna wordt deze aangemaakt
        JScrollPane scrollBar = new JScrollPane(fieldHelp);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 35, 450, 375);
        tabHelp.add(scrollBar);
    }
    
    //Deze functie zorgt ervoor dat het query selection tab beschikbaar gemaakt wordt
    public void enableQueryTab(){
        tabbedPane.setEnabledAt(1, true);
    }
    
    //Deze functie zorgt ervoor dat de tabel tabbladen beschikbaar gemaakt worden
    public void enableTableTabs(){
        tabbedPane.setEnabledAt(2, true);
        tabbedPane.setEnabledAt(3, true);
        tabbedPane.setEnabledAt(4, true);
    }
    
    public String verwerkReturnObject(ReturnObject ro){
        String result = "";
        for(String s :ro.getKolommen()){
            result += s + "  | ";
        }
        result += "\n";
        for(ArrayList a:ro.getRijen()){
            for(Object s : a){
                result += s.toString() + " | ";
            }
            result += "\n";
        }
        return result;
    }
    
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()== buttonLogin){
            loggedIn = true;
            enableQueryTab();
        }
        if(e.getSource() == buttonSelection1){
            qSelected = true;
            try{
                String q =  "SELECT COUNT(*) as [Aantal klanten], [City] "
                          + "FROM [CRONUS Nederland BV$Customer][Customer] GROUP BY [City] "
                          + "ORDER BY [Aantal klanten] DESC";
                if(q.equals("")){
                    text.setText("Geen query ingevoerd");
                }else{
                    cp = new ComProtocol("localhost", 5555);
                    ClientObject o = new ClientObject("test", "test", cp.getSelectQuery(), q);   
                    cp.send(o);
                    ReturnObject ro = (ReturnObject) cp.recieve();
                    cp.close();
                    if(ro == null){
                        System.out.println("Query fout");
                    }else{
                        if(ro.getMessage().equals("ok")){
                            System.out.println("query ok");
                            pie.verwerkReturnObject(ro);
                            repaint();
                            System.out.println("Aangemaakt.");
                            //tabbedPane.addTab("Pie chart", new Piechart(ro));
                        }else{
                            System.out.println("Geen resultaten gevonden");
                        }
                    }
                }
            }catch(Exception a){
                a.printStackTrace();
            }
        }
        if(e.getSource() == buttonSelection2){
            qSelected = true;
        }
        if(e.getSource() == buttonSelection3){
            qSelected = true;
        }
        if(loggedIn == true && qSelected == true){
            enableTableTabs();
        }
    }
}
